/*
 * Facturacion.java
 *
 * Created on 2 de febrero de 2006, 13:14
 */
package administrador;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import java.sql.*;
import javax.swing.*;
import java.math.*;
import java.text.*;

//Probando
import org.jdesktop.application.Action;

/**
 *
 * @author daniel1
 */
public class KardexInOut extends javax.swing.JPanel {

    //Parametros:
    Conexion conexion;
    int s = 0;
    int empleado = 0;
    int bodega = 0;
    String fecha;
    boolean actualizoSubtotal = true;
    boolean silimpio = false;
    javax.swing.JTabbedPane tp_controles;
    String comprobante = "";
    String letraDoc = "";
    // String detalleReporteReemplazo="";
    String descripcionReemplazos = "";
    Usuario user;
    //Nath Redondeo
    NumberFormat nf = NumberFormat.getNumberInstance();
    //ClientesFactura cfactura;
    //Referencia para cerrar la ventana desde el viewer:area
    AdministradorView aviewer;
    //Por defecto se pone cero para que no tome en cuenta si esta activa  o no la factura    
    int estaActivaDoc = 0;
    int tipokfactura;
    //Buscador:
    BuscadorProducto b;
    //Pasar parametros
    boolean eventoTabla = true;
    //Factura Cargada por la Web.
    public int facturaCargada;

    public KardexInOut(Conexion cEnt, int BEnt, Usuario user, int estaActivaDoc, int tipokfactura, javax.swing.JTabbedPane tp_controles) {
        this.tp_controles = tp_controles;
        DecimalFormat dec = (DecimalFormat) nf;
        dec.applyPattern("###.##");
        this.estaActivaDoc = estaActivaDoc;
        bodega = BEnt;
       //System.out.println("La bodega en uso es:" + bodega);
        conexion = cEnt;
        initComponents();
        b = new BuscadorProducto(conexion, this, bodega);
        b.setVisible(false);
        //Para que no puedan mover las Columnas:
        tabla.getTableHeader().setReorderingAllowed(false);

        //Defino si es kfactura de Credito o debito:
        this.tipokfactura = tipokfactura;
        cargoTipoDoc(tipokfactura);
        this.user = user;

        cargaVendedor(user);

        //txt_nom.setEditable(false);
        //txt_dir.setEditable(false);
        //txt_tel.setEditable(false);
        fecha = new java.sql.Date(System.currentTimeMillis()).toString();
        lbl_fecha.setText(fecha);


        numeroFactura();

        //Configuro Redondeo
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);

        //visualiza el valor del iva 
        txt_porIva.setText("0");
        txt_codFac.setVisible(false);
        btn_BuscaFac.setVisible(false);
        btn_anulaFac.setVisible(false);
        jLabel10.setVisible(false);
        lbl_anulacion.setVisible(false);
        //jScrollPane2.setVisible(false);
        lbl_fechaAnulacion.setVisible(false);

        //Oculto Campos del Costo:
        this.tsubCosto.setVisible(false);
        this.tdesCosto.setVisible(false);
        this.ttotalCosto.setVisible(false);
        this.tivaCosto.setVisible(false);
        this.txtsubcosto.setVisible(false);
        this.txtdesccosto.setVisible(false);
        this.txtivacosto.setVisible(false);
        this.txttotalcosto.setVisible(false);


        //Formateo las Columnas:
        columnaAnchos(80, 120, 0);
        columnaAnchos(40, 40, 1);
        columnaAnchos(80, 400, 2);
        columnaAnchos(40, 50, 3);
        columnaAnchos(40, 50, 4);
        columnaAnchos(40, 50, 5);

        //txt_subCosto.setVisible(false);

        asignoRender();
        //Quito los botones de anulacion para los empleados
        if (user.getPrivilegio().equals("e")) {
            this.btn_anulaFac.setEnabled(false);
        }
    }

    public void columnaAnchos(int anchoMenor, int anchoMayor, int columnaNumero) {
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setMaxWidth(anchoMayor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setMinWidth(anchoMenor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setPreferredWidth(anchoMayor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setResizable(false);
    }

    public void asignoRender() {
        //Defino los Iconos a Usar la estructura de la tabla:
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(administrador.AdministradorApp.class).getContext().getResourceMap(AdminTerminal.class);
        java.net.URL imgURL = getClass().getResource("/administrador/resources/imagenes/" + "costoVal.png");
        ImageIcon icono1 = new ImageIcon(imgURL, "todo bien");
        java.net.URL imgURL2 = getClass().getResource("/administrador/resources/imagenes/" + "costoValB.png");
        ImageIcon icono2 = new ImageIcon(imgURL2, "todo bien");
        Icon[] iconos = {icono1, icono2};

        //Creo el Render
        RenderCompras miRender = new RenderCompras(iconos);
        //Aplico a la Tabla Deudores:
        tabla.setDefaultRenderer(Object.class, miRender);
        tabla.updateUI();
    }

    public void cargoTipoDoc(int tipokfactura) {
        if (tipokfactura == 0) {
            Etiqueta.setText("Factura de Compras");
            letraDoc = "E";
        }
        if (tipokfactura == 1) {
            Etiqueta.setText("Devolucion en Compras");
            letraDoc = "S";
        }
        if (tipokfactura == 2) {
            Etiqueta.setText("Visor Compras - Devoluciones");
        }
        if (tipokfactura == 3) {
            Etiqueta.setText("Compras-Devoluciones Anuladas");
        }

    }

    //Establesco lo referencia al administrador Viewer
    public void establecerReferencia(AdministradorView avEnt) {
        aviewer = avEnt;

    }

    /**
     * This method is called from within the constructor to initialize the
     * form.Action WARNING: Do NOT modify this code. The content of this method
     * is always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        lbl_fact = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        txt_sub = new javax.swing.JTextField();
        txt_tot = new javax.swing.JTextArea();
        jScrollPane1 = new javax.swing.JScrollPane();
        tabla = new javax.swing.JTable();
        bt_registra = new javax.swing.JButton();
        bt_limpiar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        txt_nom = new javax.swing.JTextField();
        txt_tel = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        txt_id = new javax.swing.JTextField();
        bt_mod = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        txt_porDesc = new javax.swing.JTextField();
        txt_porIva = new javax.swing.JTextField();
        bt_ap = new javax.swing.JButton();
        bt_borrar = new javax.swing.JButton();
        jLabel14 = new javax.swing.JLabel();
        Etiqueta = new javax.swing.JLabel();
        lbl_vend = new javax.swing.JLabel();
        txt_vend = new javax.swing.JPasswordField();
        ck_desc = new javax.swing.JCheckBox();
        txt_desc = new javax.swing.JTextField();
        txt_iva = new javax.swing.JTextField();
        txt_codFac = new javax.swing.JTextField();
        btn_BuscaFac = new javax.swing.JButton();
        btn_anulaFac = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jLabel10 = new javax.swing.JLabel();
        lbl_fecha = new javax.swing.JLabel();
        lbl_anulacion = new javax.swing.JLabel();
        lbl_f = new javax.swing.JLabel();
        lbl_fechaAnulacion = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        cb_metodo = new javax.swing.JComboBox();
        jLabel11 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        txt_dir = new javax.swing.JTextArea();
        jButton3 = new javax.swing.JButton();
        txtsubcosto = new javax.swing.JLabel();
        txtdesccosto = new javax.swing.JLabel();
        txtivacosto = new javax.swing.JLabel();
        txttotalcosto = new javax.swing.JLabel();
        ttotalCosto = new javax.swing.JTextField();
        tsubCosto = new javax.swing.JTextField();
        tdesCosto = new javax.swing.JTextField();
        tivaCosto = new javax.swing.JTextField();

        jButton1.setText("jButton1");

        setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                formMouseEntered(evt);
            }
        });
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                formKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                formKeyTyped(evt);
            }
        });
        setLayout(null);

        jLabel5.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel5.setText("Nota Nro: ");
        add(jLabel5);
        jLabel5.setBounds(40, 80, 110, 20);

        lbl_fact.setFont(new java.awt.Font("Tahoma", 1, 12));
        add(lbl_fact);
        lbl_fact.setBounds(130, 80, 90, 20);

        jLabel7.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel7.setText("Subtotal");
        add(jLabel7);
        jLabel7.setBounds(550, 400, 70, 20);

        jLabel8.setText("IVA");
        add(jLabel8);
        jLabel8.setBounds(550, 440, 70, 20);

        jLabel9.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel9.setText("Total");
        add(jLabel9);
        jLabel9.setBounds(550, 460, 70, 20);

        txt_sub.setEditable(false);
        txt_sub.setText("0.00");
        txt_sub.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        add(txt_sub);
        txt_sub.setBounds(600, 400, 140, 20);

        txt_tot.setEditable(false);
        txt_tot.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        txt_tot.setForeground(new java.awt.Color(204, 102, 0));
        txt_tot.setText("0.00");
        txt_tot.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        add(txt_tot);
        txt_tot.setBounds(600, 460, 140, 20);

        jScrollPane1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(198, 196, 196)));

        tabla.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        tabla.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null}
            },
            new String [] {
                "Codigo", "Cant", "Articulo", "PCV", "PVP", "Total"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                true, true, false, false, true, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tabla.getModel().addTableModelListener(new MyTableChangedListener());
        tabla.addInputMethodListener(new java.awt.event.InputMethodListener() {
            public void caretPositionChanged(java.awt.event.InputMethodEvent evt) {
            }
            public void inputMethodTextChanged(java.awt.event.InputMethodEvent evt) {
                tablaInputMethodTextChanged(evt);
            }
        });
        jScrollPane1.setViewportView(tabla);

        add(jScrollPane1);
        jScrollPane1.setBounds(40, 200, 700, 180);

        bt_registra.setText("Registrar");
        bt_registra.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_registraActionPerformed(evt);
            }
        });
        add(bt_registra);
        bt_registra.setBounds(630, 490, 110, 30);

        bt_limpiar.setText("Limpiar Todo");
        bt_limpiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_limpiarActionPerformed(evt);
            }
        });
        add(bt_limpiar);
        bt_limpiar.setBounds(510, 490, 120, 30);

        jLabel1.setText("Provedor-Cliente:");
        add(jLabel1);
        jLabel1.setBounds(20, 110, 90, 20);

        jLabel2.setText("Observaciones:");
        add(jLabel2);
        jLabel2.setBounds(30, 140, 80, 20);

        jLabel3.setText("Telefono");
        add(jLabel3);
        jLabel3.setBounds(390, 160, 70, 20);
        add(txt_nom);
        txt_nom.setBounds(110, 110, 270, 30);
        add(txt_tel);
        txt_tel.setBounds(440, 160, 140, 20);

        jLabel4.setText("RUC");
        add(jLabel4);
        jLabel4.setBounds(400, 130, 50, 20);

        txt_id.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_idKeyTyped(evt);
            }
        });
        add(txt_id);
        txt_id.setBounds(440, 130, 140, 20);

        bt_mod.setText("Crea-ModificarProv-Cli");
        bt_mod.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_modActionPerformed(evt);
            }
        });
        add(bt_mod);
        bt_mod.setBounds(600, 70, 140, 30);

        jLabel6.setText("Desc.");
        add(jLabel6);
        jLabel6.setBounds(550, 420, 50, 20);

        txt_porDesc.setText("0");
        txt_porDesc.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        txt_porDesc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_porDescActionPerformed(evt);
            }
        });
        txt_porDesc.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_porDescKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_porDescKeyTyped(evt);
            }
        });
        add(txt_porDesc);
        txt_porDesc.setBounds(600, 420, 40, 18);

        txt_porIva.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        txt_porIva.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_porIvaKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_porIvaKeyTyped(evt);
            }
        });
        add(txt_porIva);
        txt_porIva.setBounds(600, 440, 40, 20);

        bt_ap.setText("Aderir Producto");
        bt_ap.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_apActionPerformed(evt);
            }
        });
        add(bt_ap);
        bt_ap.setBounds(170, 380, 150, 40);

        bt_borrar.setText("Borrar Articulo");
        bt_borrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_borrarActionPerformed(evt);
            }
        });
        add(bt_borrar);
        bt_borrar.setBounds(320, 380, 130, 40);

        jLabel14.setForeground(new java.awt.Color(255, 153, 0));
        jLabel14.setText(" Creacion");
        add(jLabel14);
        jLabel14.setBounds(10, 30, 70, 40);

        Etiqueta.setFont(new java.awt.Font("Stencil", 1, 24));
        Etiqueta.setForeground(new java.awt.Color(153, 0, 0));
        Etiqueta.setText("NOTAS");
        add(Etiqueta);
        Etiqueta.setBounds(10, 10, 490, 45);

        lbl_vend.setForeground(new java.awt.Color(204, 0, 0));
        lbl_vend.setText("Vendedor");
        add(lbl_vend);
        lbl_vend.setBounds(610, 170, 70, 20);

        txt_vend.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_vendKeyTyped(evt);
            }
        });
        add(txt_vend);
        txt_vend.setBounds(670, 170, 70, 20);

        ck_desc.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        ck_desc.setMargin(new java.awt.Insets(0, 0, 0, 0));
        ck_desc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ck_descActionPerformed(evt);
            }
        });
        add(ck_desc);
        ck_desc.setBounds(740, 420, 20, 20);

        txt_desc.setEditable(false);
        txt_desc.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        txt_desc.setText("0.00");
        txt_desc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_descActionPerformed(evt);
            }
        });
        txt_desc.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_descKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_descKeyTyped(evt);
            }
        });
        add(txt_desc);
        txt_desc.setBounds(640, 420, 100, 20);

        txt_iva.setEditable(false);
        txt_iva.setText("0.00");
        add(txt_iva);
        txt_iva.setBounds(640, 440, 100, 20);

        txt_codFac.setFont(new java.awt.Font("Tahoma", 1, 11));
        txt_codFac.setForeground(new java.awt.Color(0, 102, 0));
        txt_codFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_codFacActionPerformed(evt);
            }
        });
        txt_codFac.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txt_codFacKeyPressed(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_codFacKeyTyped(evt);
            }
        });
        add(txt_codFac);
        txt_codFac.setBounds(250, 90, 130, 20);

        btn_BuscaFac.setText("Buscar");
        btn_BuscaFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_BuscaFacActionPerformed(evt);
            }
        });
        add(btn_BuscaFac);
        btn_BuscaFac.setBounds(310, 60, 70, 30);

        btn_anulaFac.setText("Anular");
        btn_anulaFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_anulaFacActionPerformed(evt);
            }
        });
        add(btn_anulaFac);
        btn_anulaFac.setBounds(650, 490, 90, 30);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        jPanel1.setLayout(null);

        jLabel10.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel10.setText("Fecha Anulacion:");
        jPanel1.add(jLabel10);
        jLabel10.setBounds(10, 30, 120, 20);

        lbl_fecha.setFont(new java.awt.Font("MS Sans Serif", 0, 12));
        jPanel1.add(lbl_fecha);
        lbl_fecha.setBounds(120, 10, 110, 20);

        lbl_anulacion.setBackground(new java.awt.Color(255, 255, 255));
        lbl_anulacion.setFont(new java.awt.Font("Microsoft Sans Serif", 0, 12));
        jPanel1.add(lbl_anulacion);
        lbl_anulacion.setBounds(130, 30, 100, 20);

        lbl_f.setFont(new java.awt.Font("Tahoma", 1, 14));
        lbl_f.setText("Fecha Emision:");
        jPanel1.add(lbl_f);
        lbl_f.setBounds(10, 10, 110, 20);
        jPanel1.add(lbl_fechaAnulacion);
        lbl_fechaAnulacion.setBounds(130, 30, 100, 20);

        add(jPanel1);
        jPanel1.setBounds(490, 10, 240, 60);

        jButton2.setText("Crear Producto");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        add(jButton2);
        jButton2.setBounds(600, 100, 140, 30);

        cb_metodo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Costo Actual", "Promedio Ponderado" }));
        add(cb_metodo);
        cb_metodo.setBounds(440, 100, 140, 20);

        jLabel11.setText("Metodo:");
        add(jLabel11);
        jLabel11.setBounds(390, 100, 40, 20);

        txt_dir.setColumns(20);
        txt_dir.setRows(5);
        jScrollPane2.setViewportView(txt_dir);

        add(jScrollPane2);
        jScrollPane2.setBounds(110, 140, 270, 50);

        jButton3.setText("Cargar desde Web");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });
        add(jButton3);
        jButton3.setBounds(600, 133, 140, 30);

        txtsubcosto.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        txtsubcosto.setText("Subtotal");
        add(txtsubcosto);
        txtsubcosto.setBounds(770, 400, 70, 20);

        txtdesccosto.setText("Desc.");
        add(txtdesccosto);
        txtdesccosto.setBounds(770, 420, 50, 20);

        txtivacosto.setText("IVA");
        add(txtivacosto);
        txtivacosto.setBounds(770, 440, 40, 20);

        txttotalcosto.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        txttotalcosto.setText("Total");
        add(txttotalcosto);
        txttotalcosto.setBounds(770, 460, 50, 20);
        add(ttotalCosto);
        ttotalCosto.setBounds(830, 460, 100, 20);
        add(tsubCosto);
        tsubCosto.setBounds(830, 400, 100, 20);
        add(tdesCosto);
        tdesCosto.setBounds(830, 420, 100, 20);
        add(tivaCosto);
        tivaCosto.setBounds(830, 440, 100, 20);
    }// </editor-fold>//GEN-END:initComponents

    private void txt_porIvaKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porIvaKeyReleased
// TODO add your handling code here:
        actualizoTotales();
    }//GEN-LAST:event_txt_porIvaKeyReleased

    private void txt_vendKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_vendKeyTyped
// TODO add your handling code here:
        int presiona = evt.getKeyChar();
        if (presiona == 10) {
            String clave = txt_vend.getText();
            ResultSet resp = conexion.consultarBase("select * from usuario where clave='" + clave + "'");
            try {
                resp.beforeFirst();
                resp.next();
                String nombre = resp.getString(2);
                lbl_vend.setText(nombre);

            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Hay un error en la clave", "Informacion", JOptionPane.INFORMATION_MESSAGE);
            }

        }
        txt_vend.setText("");
    }//GEN-LAST:event_txt_vendKeyTyped

    private void bt_borrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_borrarActionPerformed
// TODO add your handling code here:
        borrPro();
}//GEN-LAST:event_bt_borrarActionPerformed
    public void borrPro() {
        int fila = tabla.getSelectedRow();
        int column = tabla.getColumnCount();
        //System.out.println("La fila Seleccionada es:"+fila);
        if (fila == -1) {
            JOptionPane.showMessageDialog(this, "Seleccione almenos un articulo para Borrarlo", "Informacion", JOptionPane.INFORMATION_MESSAGE);
        } else {
            for (int i = 0; i < column; i++) {

                tabla.setValueAt(null, fila, i);

            }

        }
        actualizoTotales();
    }

    private void formKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyReleased
// TODO add your handling code here:
       //System.out.println(evt.getKeyCode());
    }//GEN-LAST:event_formKeyReleased

    private void bt_apActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_apActionPerformed
// TODO add your handling code here:
        addProd();
}//GEN-LAST:event_bt_apActionPerformed
    public void addProd() {
        tabla.clearSelection();
        b.txt_buscar.setText("");
        b.setVisible(true);
    }

    public void muestraHist() {
        VerFacturas v = new VerFacturas(conexion, bodega, user);
    }
    String textoIngresado = "";
    private void txt_porIvaKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porIvaKeyTyped
// TODO add your handling code here:
        int press = evt.getKeyChar();
        if (press == 10) {
            actualizoTotales();
        }
    }//GEN-LAST:event_txt_porIvaKeyTyped

    private void formKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyTyped
// TODO add your handling code here:
       //System.out.println(evt.getKeyChar());
    }//GEN-LAST:event_formKeyTyped

    private void bt_modActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_modActionPerformed
// TODO add your handling code here:
        cmCliente();
    }//GEN-LAST:event_bt_modActionPerformed
    public void cmCliente() {
        CreaCliente cc = new CreaCliente(conexion, txt_id.getText(), this, user);
    }

    private void txt_idKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_idKeyTyped
        //valido que no puedan ingresar mas que numeros
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))) {
            getToolkit().beep();
            evt.consume();
        }
        int press = evt.getKeyChar();

        String textoV = this.txt_id.toString();
        if (!(textoV.length() > 13)) {
            evt.consume();
        }



        //Limpio si escribes otro codigo
        txt_nom.setText("");
        txt_tel.setText("");
        txt_dir.setText("");

        //Si es Enter:

        if (press == 10) {
//        bt_mod.setVisible(true);
            ResultSet r;
            String codigo = txt_id.getText();
            codigo = codigo.replaceAll(" ", "");

            //Consulto si es que Existe el Cliente:
            r = conexion.consultarBase("select nombre,apellido,direccion,telefono from cliente where cod_cliente like '" + codigo + "'");
            String cod, cli, nom, ape, dir, tel;

            try {
                //***************************************
                //En el caso de que el cliente no exista:
                r.last();
                int filas = r.getRow();
                if (filas == 0) {
                   //System.out.println("Cliente no existe");
                    CreaCliente cc = new CreaCliente(conexion, txt_id.getText(), this, user);
                } else {
                    //***************************************
                    //En el caso de que el cliente exista:
                    r.beforeFirst();
                    while (r.next()) {
                        nom = r.getString(1);
                        ape = r.getString(2);
                        dir = r.getString(3);
                        tel = r.getString(4);

                        txt_nom.setText(nom + " " + ape);
                        txt_dir.setText(dir);
                        txt_tel.setText(tel);
                    }
                }
            } catch (SQLException sqle) {
               //System.out.println("Error Consulta Cliente");
                System.err.println(sqle);
            }

        }

    }//GEN-LAST:event_txt_idKeyTyped

    private void bt_limpiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_limpiarActionPerformed
// TODO add your handling code here:
        limpiar();

}//GEN-LAST:event_bt_limpiarActionPerformed
    public void cargaVendedor(Usuario user) {
        lbl_vend.setText(user.nombre);
    }

    public void limpiar() {
        silimpio = true;
        //Limpio Tabla
        int filas = tabla.getRowCount();
        int columnas = tabla.getColumnCount();
        int cont = 0;
        while (cont < filas) {
            try {
                for (int i = 0; i < columnas; i++) {
                    //System.out.println("valor fila:"+cont+" columnas: "+i);
                    tabla.setValueAt(null, cont, i);
                    ////System.out.println(toma);
                }
            } catch (Exception e) {
            };
            cont++;
        }
        //Limpio de texto
        txt_sub.setText("0.00");
        txt_tot.setText("0.00");
        txt_desc.setText("0.00");
        txt_iva.setText("0.00");
        txt_vend.setText("");
        //limpio porcentajes:
        txt_porDesc.setText("0");
        //txt_porIva.setText("0");
        //Otro panel
        txt_id.setText("");
        txt_nom.setText("");
        txt_dir.setText("");
        txt_tel.setText("");

        cargaVendedor(user);
        int n = numeroFactura();
        pongoTabNum(n);

        //Reestablecer permisos
        bt_ap.setEnabled(true);
        this.bt_borrar.setEnabled(true);


        silimpio = false;
    }
    /*public int numeroFactura3(){
     int numeroFactura=0;
     String tipoComp;
     char tipoBD;
     try{
     //Pregunto si es kfactura de Credito o de Debito:
     if(tipokfactura==0){
     //Saco numero kfactura de Debito
     tipoComp="Ventas X Mayor"; 
     tipoBD='S';
     }else{
     //Saco numero kfactura de Credito
     tipoComp="Factura de Compras";
     tipoBD='E';
            
     }
     //Saco el maximo segun SRI
     //            ResultSet codInicioSri=conexion.consultarBase("select max(num_secuencia) from tipo_comprobante where nombre='"+tipoComp+"'");
     //            codInicioSri.next();
     //            int numeroSri=codInicioSri.getInt(1);
     //Saco el maximo segun ultima facturakfactura
     ResultSet r=conexion.consultarBase("SELECT MAX(cod_Kfactura) FROM kfactura;");
     r.next();
     int numero=r.getInt(1);
     //Comparo los numeros de Factura y kfacturas de Venta:
     //            if(numero==0 || numero<numeroSri){
     //               numero= numeroSri;
     //            }else{
     //                numero+=1;
     //            }
     numero++;
    //System.out.println("Numero Factura Generado: "+numero);
     lbl_fact.setText(String.valueOf(numero));
     //Refresco el Tab y le pongo el numero de Factura Nuevo:
     int seleccion=tp_controles.getSelectedIndex();
     if(seleccion!=0){
     String[] titulo=tp_controles.getTitleAt(seleccion).split("#");
            
     tp_controles.setTitleAt(seleccion,titulo[0]+"#"+String.valueOf(numero));
     }
            
     numeroFactura=numero;
     } catch(java.sql.SQLException e){
     // System.err.println(e);
     };
        
        
     return numeroFactura;
     }*/

    public void pongoTabNum(int numero) {
        //Refresco el Tab y le pongo el numero de Factura Nuevo:
        int seleccion = tp_controles.getSelectedIndex();
        if (seleccion != 0) {
            String[] titulo = tp_controles.getTitleAt(seleccion).split("#");

            tp_controles.setTitleAt(seleccion, titulo[0] + "#" + String.valueOf(numero));
        }

    }

    public int numeroFactura() {
        int numeroFactura = 1;
        String tipoComp;
        char tipoBD;

        //Pregunto si es kfactura de Credito o de Debito:
        if (tipokfactura == 0) {
            //Saco numero kfactura de Debito
            tipoComp = "Factura de Compras";
            tipoBD = 'E';
        } else {
            //Saco numero kfactura de Credito
            tipoComp = "Devolucion en Compras";
            tipoBD = 'S';

        }

        try {
            //Proceso para Obtener el Secuencial de la Factura en Devolucion en Compras

            ResultSet codInicioSri = conexion.consultarBase("select max(num_secuencia) from tipo_comprobante where nombre='" + Etiqueta.getText() + "'");
            codInicioSri.next();
            ResultSet r = conexion.consultarBase("select MAX(cod_kfactura) from kfactura where tipo_comprobante='" + tipoBD + "'");
            r.next();
            int numero = r.getInt(1);
            int numeroSri = codInicioSri.getInt(1);
            if (numero == 0 || numero < numeroSri) {
                numero = numeroSri;
            } else {
                numero += 1;
            }
           //System.out.println("Numero Factura Generado: " + numero);
            lbl_fact.setText(String.valueOf(numero));




            numeroFactura = numero;
        } catch (java.sql.SQLException e) {
        };
        return numeroFactura;
    }
    public void bt_registraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_registraActionPerformed
        aplastoRegistrar();

    }//GEN-LAST:event_bt_registraActionPerformed
    @Action
    public void aplastoRegistrar() {
       //System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
        if (!txt_id.getText().equals("") && !txt_tot.getText().equals("0.0")) {


            int opccion = 0;
            opccion = JOptionPane.showConfirmDialog(this, "Seguro Desea Guardar esta Factura?", "Alerta", 0);
            if (opccion == 0) {

                String comprobante = "";
                String letraDoc = "";

                //System.out.println("Etiqueta es:"+Etiqueta.);
                if (Etiqueta.getText().equals("Devolucion en Compras")) {

                    letraDoc = "S";
                   //System.out.println("La letra que pone es:" + letraDoc);

                } else {

                    letraDoc = "E";
                   //System.out.println("La letra que pone es:" + letraDoc);

                }

                FPagoCompVent fpcv = new FPagoCompVent(conexion, bodega, user, letraDoc, this);
            }
        } else {

            JOptionPane.showMessageDialog(this, "Complete todos los datos de la factura", "Informacion", JOptionPane.INFORMATION_MESSAGE);
        }
    }
    String NombreRS = "";
    String RucEmisor = "";
    String DireccionLocal = "";
    String AutSRI = "";
    String FechaCaducidad = "";
    String NombreDueno = "";

    public void obtenParmetros() {
        java.util.Vector vec = conexion.consulta("select * from parametros limit 1");
        java.util.Vector vecInterno = new java.util.Vector();
        for (int i = 0; i < vec.size(); i++) {
            vecInterno = (java.util.Vector) vec.elementAt(i);
            NombreRS = vecInterno.elementAt(1).toString();
            NombreDueno = vecInterno.elementAt(8).toString();
            RucEmisor = vecInterno.elementAt(2).toString();
            DireccionLocal = vecInterno.elementAt(3).toString();
            AutSRI = vecInterno.elementAt(6).toString();
            FechaCaducidad = vecInterno.elementAt(7).toString();
        }
    }

    public String recuperaTerminal(String codSucursal, String mac) {
        String consultaTerminal = "select t.cod_terminales "
                + "from   bodega b,terminales t "
                + "where  b.cod_bodega=t.cod_bodega and identificador like '" + mac + "' and b.cod_bodega=" + codSucursal + " limit 1";
       //System.out.println(consultaTerminal + "^&");
        String terminal = "";
        java.util.Vector vec = conexion.consulta(consultaTerminal);
        java.util.Vector vecInt = new java.util.Vector();
        for (int i = 0; i < vec.size(); i++) {
            vecInt = (java.util.Vector) vec.elementAt(i);
            terminal = vecInt.elementAt(0).toString();
        }
        return terminal;
    }

    public void asientoEfectivo() {
        //Registro Asiento de Compra:
        String numeroDiario = numeroDiario();
        this.asiento(numeroDiario, lbl_fecha.getText(), "Asiento de Compra  # E_" + lbl_fact.getText());
        String numeroAsiento = numeroAsiento();
        asientoDetalle(numeroAsiento, numeroDiario, "5", "1", "1", "0", txt_sub.getText(), "0");   //Inventario de Mercaderias
        asientoDetalle(numeroAsiento, numeroDiario, "7", "1", "1", "0", txt_iva.getText(), "0");  // Iva Compras  debe
        asientoDetalle(numeroAsiento, numeroDiario, "1", "1", "1", "0", "0", txt_tot.getText());   //Caja  haber
        asientoDetalle(numeroAsiento, numeroDiario, "2", "1", "5", "0", "0", txt_desc.getText());   //Descuento Compras  haber


    }

    public void asientoCuentasPagar() {
        String numeroDiario = numeroDiario();
        //Compra con Deudas x Pagar
        this.asiento(numeroDiario, lbl_fecha.getText(), "Asiento de Compra # E_" + lbl_fact.getText());
        String numeroAsiento = numeroAsiento();
        asientoDetalle(numeroAsiento, numeroDiario, "5", "1", "1", "0", txt_sub.getText(), "0");   //Invetarios de Mercaderias
        asientoDetalle(numeroAsiento, numeroDiario, "7", "1", "1", "0", txt_iva.getText(), "0");  // Iva Compras debe
        asientoDetalle(numeroAsiento, numeroDiario, "6", "1", "2", "0", "0", txt_tot.getText());   //Cuentas x Pagar  haber
        asientoDetalle(numeroAsiento, numeroDiario, "2", "1", "5", "0", "0", txt_desc.getText());   //Descuento Compras haber
    }

    public void asientoPagoCredito() {
        String numeroDiario = numeroDiario();
        //Compra con un Credito Adquirido:
        this.asiento(numeroDiario, lbl_fecha.getText(), "Asiento de Compra # E_" + lbl_fact.getText());
        String numeroAsiento = numeroAsiento();
        asientoDetalle(numeroAsiento, numeroDiario, "5", "1", "1", "0", txt_sub.getText(), "0");   //Invetarios de Mercaderias
        asientoDetalle(numeroAsiento, numeroDiario, "7", "1", "1", "0", txt_iva.getText(), "0");  // Iva Compras debe
        asientoDetalle(numeroAsiento, numeroDiario, "3", "1", "1", "0", "0", txt_tot.getText());   //Cuentas x Cobrar  haber
        asientoDetalle(numeroAsiento, numeroDiario, "2", "1", "5", "0", "0", txt_desc.getText());   //Descuento Compras haber
    }

    public void asientoDevCompras() {
        //Registro Asiento de Devolucion en Compra:
        String numeroDiario = numeroDiario();
        this.asiento(numeroDiario, lbl_fecha.getText(), "Asiento Dev/Compra Efectivo  # S_" + lbl_fact.getText());
        String numeroAsiento = numeroAsiento();
        asientoDetalle(numeroAsiento, numeroDiario, "1", "1", "1", "0", txt_tot.getText(), "0");   //Caja  haber
        asientoDetalle(numeroAsiento, numeroDiario, "2", "1", "5", "0", txt_desc.getText(), "0");   //Descuento Compras  haber
        asientoDetalle(numeroAsiento, numeroDiario, "5", "1", "1", "0", "0", txt_sub.getText());   //Inventario de Mercaderias
        asientoDetalle(numeroAsiento, numeroDiario, "7", "1", "1", "0", "0", txt_iva.getText());  // Iva Compras  debe

    }

    public void asientoCuentasCobrar() {
        // Registro Asiento Devolucion en Compras Adquiriendo Credito(Cuentas x Cobrar).
        String numeroDiario = numeroDiario();
        this.asiento(numeroDiario, lbl_fecha.getText(), "Asiento Dev/Compra CuentasxCobrar # S_" + lbl_fact.getText());
        String numeroAsiento = numeroAsiento();
        asientoDetalle(numeroAsiento, numeroDiario, "3", "1", "1", "0", txt_tot.getText(), "0");   //Cuentas x Cobrar  haber
        asientoDetalle(numeroAsiento, numeroDiario, "2", "1", "5", "0", txt_desc.getText(), "0");   //Descuento Compras  haber
        asientoDetalle(numeroAsiento, numeroDiario, "5", "1", "1", "0", "0", txt_sub.getText());   //Inventario de Mercaderias
        asientoDetalle(numeroAsiento, numeroDiario, "7", "1", "1", "0", "0", txt_iva.getText());  // Iva Compras  debe
    }

    public void asientoAnula(String cod_Comprobante, String letraDoc) {
        if (letraDoc.equals("E")) {//Anula el Asiento de Compras

            String consulta = "select d.cod_tercernivel,d.cod_segundonivel,d.cod_primernivel,d.debe,d.haber,ass.referencia "
                    + "from dtl_asiento d,tercernivel t,asiento ass "
                    + "where t.cod_tercernivel=d.cod_tercernivel "
                    + "and t.cod_segundonivel=d.cod_segundonivel "
                    + "and t.cod_primernivel=d.cod_primernivel and "
                    + "ass.cod_asiento=d.cod_asiento and "
                    + "ass.referencia like '%E_" + cod_Comprobante + "%'";
            java.util.Vector vecPrincipal = conexion.consulta(consulta);
            java.util.Vector vecInterno = new java.util.Vector();
            String numeroDiario = numeroDiario();
            asiento(numeroDiario, fecha, "Anulacion Compra # " + txt_codFac.getText());
            String numeroAsiento = numeroAsiento();
            for (int i = 0; i < vecPrincipal.size(); i++) {
                vecInterno = (java.util.Vector) vecPrincipal.elementAt(i);
                asientoDetalle(numeroAsiento, numeroDiario, vecInterno.elementAt(0).toString(), vecInterno.elementAt(1).toString(), vecInterno.elementAt(2).toString(), "0", vecInterno.elementAt(4).toString(), vecInterno.elementAt(3).toString());   //Iva en Ventas  haber
            }


        } else if (letraDoc.equals("S")) {//Anula el Asiento de Devolucion en COmpras:
            String consulta = "select d.cod_tercernivel,d.cod_segundonivel,d.cod_primernivel,d.debe,d.haber,ass.referencia "
                    + "from dtl_asiento d,tercernivel t,asiento ass "
                    + "where t.cod_tercernivel=d.cod_tercernivel "
                    + "and t.cod_segundonivel=d.cod_segundonivel "
                    + "and t.cod_primernivel=d.cod_primernivel and "
                    + "ass.cod_asiento=d.cod_asiento and "
                    + "ass.referencia like '%S_" + cod_Comprobante + "%'";
            java.util.Vector vecPrincipal = conexion.consulta(consulta);
            java.util.Vector vecInterno = new java.util.Vector();
            String numeroDiario = numeroDiario();
            asiento(numeroDiario, fecha, "Anulacion Devolucion-Compra # " + txt_codFac.getText());
            String numeroAsiento = numeroAsiento();
            for (int i = 0; i < vecPrincipal.size(); i++) {
                vecInterno = (java.util.Vector) vecPrincipal.elementAt(i);
                asientoDetalle(numeroAsiento, numeroDiario, vecInterno.elementAt(0).toString(), vecInterno.elementAt(1).toString(), vecInterno.elementAt(2).toString(), "0", vecInterno.elementAt(4).toString(), vecInterno.elementAt(3).toString());   //Iva en Ventas  haber
            }
        }

    }

    public String numeroDiario() {
        String numero = "";
        try {
            java.sql.ResultSet r = conexion.consultarBase("select  cod_diario from diario where fecha_diario=(select max(fecha_diario) from diario) limit 1");
            r.next();
            numero = r.getString(1);
        } catch (SQLException f) {
        }
        return numero;
    }

    public String numeroAsiento() {
        String numero = "";
        try {
            java.sql.ResultSet r = conexion.consultarBase("select max(cod_asiento) from asiento");
            r.next();
            numero = r.getString(1);
        } catch (SQLException f) {
        }
        return numero;
    }

    public void asiento(String numeroDiario, String fecha, String referencia) {
        conexion.insertarDatos("insert into asiento(cod_diario,fecha_dia,referencia) values(" + numeroDiario + ",'" + fecha + "','" + referencia + "')");
    }

    public void asientoDetalle(String numeroAsiento, String numeroDiario, String n3, String n2, String n1, String parcial, String debe, String haber) {
        String consultaDtlAs = "insert into dtl_asiento "
                + "(cod_diario,cod_asiento,cod_tercernivel,cod_segundonivel,cod_primernivel,parcial,debe,haber) "
                + "values (" + numeroDiario + "," + numeroAsiento + "," + n3 + "," + n2 + "," + n1 + "," + parcial + "," + debe + "," + haber + ")";
        conexion.insertarDatos(consultaDtlAs);
    }
    MacAddress macA = new MacAddress();

    public void registrarFactura(String documento, String letraDoc, int tipoPago) {
        //Inicio la Transaccion de Insercion de Facturas:
        conexion.consultarBase("START TRANSACTION;");
        //

        String Doc = documento;
        numeroFactura();
       //System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
        if (!txt_id.getText().equals("") && !txt_tot.getText().equals("0.0")) {
            obtenParmetros();
            //Creo el trabajo de impresion:
            //Saco datos para la estacion:
            String terminal = recuperaTerminal(String.valueOf(bodega), "%");
            Imprimir TrabImpresion = new Imprimir(String.valueOf(bodega), terminal, this.lbl_fact.getText(), txt_id.getText().toString(), txt_nom.getText().toString(), txt_tel.getText().toString(), txt_dir.getText().toString(), Etiqueta.getText(), NombreRS, NombreDueno, RucEmisor, DireccionLocal, AutSRI, FechaCaducidad);
            //inserto cabecera factura;


            String hora = new java.sql.Time(System.currentTimeMillis()).toString();
            String fecha = new java.sql.Date(System.currentTimeMillis()).toString();
           //System.out.println("@@@ Ingreso la cabecera de factura  @@@");

            //Redondeo los Valores de la Factura:
            String totRed = nf.format(Double.parseDouble(txt_tot.getText())).replaceAll(",", ".");
            String subRed = nf.format(Double.parseDouble(txt_sub.getText())).replaceAll(",", ".");
            String ivaRed = nf.format(Double.parseDouble(txt_porIva.getText())).replaceAll(",", ".");
            String descRed = nf.format(Double.parseDouble(txt_desc.getText())).replaceAll(",", ".");




            //txt_tot.getText()+"',"+txt_porIva.getText()+","+txt_desc.getText()+","+txt_sub.getText()

            conexion.insertarDatos("insert into kfactura values(" + lbl_fact.getText() + ",'" + txt_id.getText() + "','" + txt_dir.getText() + "','" + fecha + "','Cuenca','Ecuador','Azuay','" + txt_tel.getText() + "','" + lbl_vend.getText() + "'," + totRed + "," + ivaRed + "," + descRed + "," + subRed + ",'A',null,'','" + letraDoc + "'," + terminal + "," + bodega + "," + AutSRI + "," + this.ttotalCosto.getText() + ")");
           //System.out.println("@@@FIN Ingreso la cabecera de factura  @@@");
            //Inserto detalle factura;
            //Inserto detalle factura;
           //System.out.println("El @@ tipo de pago es " + letraDoc + " con la opcion:" + tipoPago);
            if (letraDoc.equals("E")) {//Caso que sea una Compra
                if (tipoPago == 0) { //Cliente pago en efectivo
                    asientoEfectivo();
                } else if (tipoPago == 1) { //Cuentas x Pagar
                    asientoCuentasPagar();
                } else if (tipoPago == 2) {
                    asientoPagoCredito();//Pago con Credito adquirido
                }
            } else if (letraDoc.equals("S")) {//Caso que sea devolucion en Compras
                if (tipoPago == 0) { //Cuentas x Cobrar
                   //System.out.println("Entra 1 tipo de pago es " + letraDoc + " con la opcion:" + tipoPago);
                    asientoCuentasCobrar();
                } else if (tipoPago == 1) { //Cliente pago en efectivo
                   //System.out.println("Entra 2 tipo de pago es " + letraDoc + " con la opcion:" + tipoPago);
                    asientoDevCompras();

                }

            }


            int filas = tabla.getRowCount();
            //System.out.println("Las fila editadas son"+filas);
            int cont = 0;

            int NumProductos = cuentaProductos();
            int ProdVerificados = 0;

            //Inserto los titulos de la Factura:
            TrabImpresion.escriboFact(TrabImpresion.pongoTitulos(""));
            while (cont < filas) {
               //System.out.println("Comienza el while");
                try {
                    String codigoPro = tabla.getValueAt(cont, 0).toString();
                    String cantProVendido = tabla.getValueAt(cont, 1).toString();
                    String nombre_pro = tabla.getValueAt(cont, 2).toString();
                    String precioUnit = tabla.getValueAt(cont, 3).toString();
                    String precioVP = tabla.getValueAt(cont, 4).toString();
                    String subTot = tabla.getValueAt(cont, 5).toString();
                   //System.out.println("El detaalleee es:" + codigoPro + cantProVendido + precioUnit + subTot);

                    //Inserto detalle en el archivo de Impresion:
                    TrabImpresion.insertoDetImp(codigoPro, tabla.getValueAt(cont, 2).toString(), cantProVendido, tabla.getValueAt(cont, 4).toString(), subTot);

                    //Realizo la Insercion del los Producto que conforman el detalle:
                    //if(!esCombo(codigoPro)){
                    //En el caso de que no sea un Combo:
                    //Redondeo los Valores de la Factura:
                    subTot = nf.format(Double.parseDouble(subTot)).replaceAll(",", ".");
                   //System.out.println("El detaalleee 222es:" + codigoPro + cantProVendido + precioUnit + subTot);
                   //System.out.println("@@@  Ingreso Detalle kfactura ----- @@@");
                    conexion.insertarDatos("insert into dtl_kfactura values(" + lbl_fact.getText() + ",'" + codigoPro/*Codigo*/ + "'," + cantProVendido/*Cantidad*/ + "," + subTot/*Subtotal*/ + "," + precioVP + ",'" + letraDoc + "'," + precioVP + ",'" + nombre_pro + "')");
                   //System.out.println("@@@ FIN Ingreso Detalle Factura ----- @@@");

                   //System.out.println(" El dato con null es*" + codigoPro + "**" + cantProVendido + "*");

                    boolean actualizacionVer = actualizoStockPrecio(codigoPro, Integer.parseInt(cantProVendido), Double.valueOf(precioUnit), Double.valueOf(precioVP), letraDoc);
                    if (actualizacionVer == false) {
                        JOptionPane.showMessageDialog(this, "Error en actualizar el Precio del producto:" + codigoPro + " cantidad:" + cantProVendido + " precioU=" + precioUnit + "precioVP=" + precioVP + " letra=" + letraDoc, "Informacion", JOptionPane.INFORMATION_MESSAGE);
                    }


                    //Verifico Insercion del Detalle:
                    boolean detalleVerific = false;
                    String consulta = "SELECT * FROM dtl_kfactura where cod_kfactura=" + lbl_fact.getText() + " and cod_producto='" + codigoPro + "' and cantidad=" + cantProVendido + " and subtotal=" + subTot + ";";
                    ResultSet rsverific = conexion.consultarBase(consulta);
                    if (conexion.obtenerFilas(rsverific) > 0) {
                        detalleVerific = true;
                    }

                    if (detalleVerific == false) {
                        JOptionPane.showMessageDialog(this, "Error en la verificacion del Detalle:" + consulta + " No verifica el total de filas resultantes.", "Informacion", JOptionPane.INFORMATION_MESSAGE);
                    }

                    //Verifico El Ingreso del detalle y la actualizacion del Producto:
                    if (actualizacionVer && detalleVerific) {
                        ProdVerificados++;
                    }



                } catch (Exception e) {
                    System.err.println(e);
                }

                cont++;
            }
            //Verifico que todos los producto se han verificado:
            if (NumProductos == ProdVerificados) {
                //Insercion Verificada
                //###################################
                conexion.consultarBase("COMMIT;");
                //###################################
                //Introdusco Total en el archivo a Imprimir:
                String Pie = TrabImpresion.pieFactura(txt_sub.getText().toString(), txt_desc.getText().toString(), txt_iva.getText().toString(), txt_tot.getText().toString());
                TrabImpresion.escriboFact(Pie);
                //Introdusco si el reporteReemplazo Web
                TrabImpresion.escriboFact(this.descripcionReemplazos);


                //Guardo el Trabajo para la Copia
                Archivo archivoCopia = TrabImpresion.getArchivo();
                //Introdusco el Original.
                //Introdusco el Original.
                String Etiqueta = "BLANCO : ADQUIRIENTE \n"
                        + "COLOR  : EMISOR      \n\n\n\n\n\n";
                TrabImpresion.escriboFact(Etiqueta);
                //Imprimo:
                TrabImpresion.realizaImprecion();

                //---------------------------------------------
                //Para el caso que se necesite una copia:
                /*int opccion=0;
                 opccion=JOptionPane.showConfirmDialog(this,"Desea Imprimir una Copia?","Alerta",0);
                 if(opccion==0){
                 //Reemplazo el texto que dice copia por el nuevo texto del archivo
                 Archivo archivo=TrabImpresion.getArchivo();
                 archivo.removeLineFromFile(TrabImpresion.archNom,"           ** Original **","           ** Copia **");
                 TrabImpresion.realizaImprecion();
                 //Le regreso como estaba al principio
                 archivo.removeLineFromFile(TrabImpresion.archNom,"           ** Copia **","           ** Original **");
                    
                 }*/

                //registro factura en la Web
                registroDescargaWeb();

                //cerrarTab();
                limpiar();



            } else {
                //Se dio un problema al guardar o actualizar los productos de la factura:
                JOptionPane.showMessageDialog(this, "Numero Total de Productos:" + NumProductos + " Productos Verificados (Grabados) =" + ProdVerificados + ";", "Informacion", JOptionPane.INFORMATION_MESSAGE);
                conexion.consultarBase("ROLLBACK;");
                JOptionPane.showMessageDialog(this, "LA FACTURA NO SE GRABO DEBIDO A ALGUN PROBLEMA  EN LA ACTUALIZACION DE LOS PRODUCTOS O EN LA INSERCION DE LOS DETALLES  ", "Informacion", JOptionPane.INFORMATION_MESSAGE);
            }


        } else {
            JOptionPane.showMessageDialog(this, "Complete todos los datos de la factura", "Informacion", JOptionPane.INFORMATION_MESSAGE);

        }


    }

    public void registroDescargaWeb() {


        if (this.facturaCargada == 0) {
        } else {
            //Registro el cierre de la factura Web cuando se registra con exito una factura:
            String IPCliente = "174.136.152.21";// "174.136.152.21";
            String nombre = "sexyusuario";//"daniel1";
            String password = "yxes1984";
            String dbcliente = "sexylocuras";
            String puerto = "3306";


            //Realizo la conexion a la base de datos cliente:
            Conexion conexionWF = new Conexion();


            if (!conexionWF.conectarBase(nombre, password, puerto, dbcliente, IPCliente)) {
               //System.out.println("No pudo establecer la conexion primera");
                // JOptionPane.showMessageDialog(panelAct, "No se pudo establecer conexion con la base de datos del Internet !!", "Informacion", JOptionPane.WARNING_MESSAGE);

            } else {

                fecha = new java.sql.Date(System.currentTimeMillis()).toString();
                this.descripcionReemplazos = this.descripcionReemplazos.replaceAll("\n", "");
                conexionWF.actualizarBase("update envio set fecha_descarga='" + fecha + "',bodega_nombre='" + this.bodega + "',descargado='1',detActualizacion='" + this.descripcionReemplazos + "' where cod_factura=" + facturaCargada + ";");


                this.descripcionReemplazos = "";

                this.facturaCargada = 0;


            }




            try {
                conexionWF.cerrarConexion();
            } catch (Exception ex) {
                Logger.getLogger(KardexInOut.class.getName()).log(Level.SEVERE, null, ex);
            }


        }
    }

    @Action
    public void cerrarTab() {
        int seleccion = aviewer.tp_controles.getSelectedIndex();
        if (seleccion == 0) {
        } else {
            aviewer.tp_controles.remove(aviewer.tp_controles.getComponentAt(seleccion));
            aviewer.ventanas.remove(seleccion - 1);
        }

    }

    public boolean esCombo(String cod) {
        boolean val = false;
        //Verifico si el Combo Existe.
        ResultSet resp;
        resp = conexion.consultarBase("select * from combo where cod_combo like '" + cod + "'");
        int filasIn = conexion.obtenerFilas(resp);
        if (filasIn > 0) {
            val = true;
        }

        return val;
    }

    public boolean actualizoStockPrecio(String cod, int cant, double precioPro/*Precio de Costo*/, double precio_pvp/*Precio de Venta al Publico*/, String DocumentoKa) {

        boolean insercionVerific = false;
        try {
            //Actualizo datos del Stock:

            //Saco el numero Stock
           //System.out.println("*************************************");
            ResultSet r = conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + cod + "' and cod_bodega=" + bodega);
            // //System.out.println("Logra la consulta::::");
            r.next();
            int numeroStock = r.getInt(1);

            int stock = 0;
           //System.out.println("El Documento es:" + DocumentoKa);
            //En el caso que sean kfacturas de Debito:
            if (DocumentoKa.equals("S")) {
                // //System.out.println("El codigo es:"+numeroStock);
                stock = numeroStock - cant;
            } else if (DocumentoKa.equals("E")) {
                //Para el caso que sea una kfactura de Credito
                // //System.out.println("El codigo es:"+numeroStock);
                stock = numeroStock + cant;
            }


            //Actualizo el numero
            //System.out.println("Actualiza los datos del Item: "+cod+" de: "+numeroStock+" a:"+stock);
            conexion.insertarDatos("update itm_bodega set cantidad=" + stock + " where cod_producto like '" + cod + "' and cod_bodega=" + bodega);

            //Verifico la Actualizacion: (Verifico la Transaccion se realice exitosamente para este producto)
            r = conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + cod + "' and cod_bodega=" + bodega);
            r.next();
            int numeroActual = r.getInt(1);
            if (numeroActual == stock) {
                //Transaccion Verificada!:
                insercionVerific = true;
            }

            //Actualizo Total en los productos de las diferentes bodegas
            int tot = 0;
            ResultSet respuesta = conexion.consultarBase("select sum(cantidad) from itm_bodega where cod_producto like '" + cod + "'");
            respuesta.next();
            tot = respuesta.getInt(1);
            conexion.insertarDatos("UPDATE producto SET stock_total= " + tot + " where cod_producto like '" + cod + "'");

            //******************************
            //Actualizo Precios de Productos
            if (DocumentoKa.equals("E")) {
                respuesta = conexion.consultarBase("SELECT precio_normal FROM producto where cod_producto like '" + cod + "'");
                respuesta.next();

                double precioVentaAnterior = respuesta.getDouble(1);
                double cantidadAnterior = stock - cant;

                //Calculo el nuevo precio en funcion del metodo:
                int seleccion = cb_metodo.getSelectedIndex();

                double saldoTotalAnterior = precioVentaAnterior * (cantidadAnterior);
               //System.out.println("SaldoAnteriorTot:" + precioVentaAnterior + "*" + cantidadAnterior);
                double saldoTotalActual = precio_pvp * cant;
               //System.out.println("SaldoActualTot:" + precio_pvp + "*" + cant);

                double nuevoPrecioVenta;
                if (seleccion == 0) {
                    //Metodo de Costo Actual
                    nuevoPrecioVenta = precio_pvp;
                   //System.out.println("Reemplaza por el precioNuevo:" + precio_pvp);
                } else {
                    //Metodo de Promedio Ponderado
                    double saldoFinal = saldoTotalAnterior + saldoTotalActual;
                   //System.out.println("Los Saldos son:" + saldoTotalAnterior + "+" + saldoTotalActual);
                    double nuevaCantidad = cantidadAnterior + cant;
                   //System.out.println("Nueva cantidad:" + cantidadAnterior + "+" + cant);
                    nuevoPrecioVenta = saldoFinal / nuevaCantidad;
                   //System.out.println("Nuevo Precio:" + saldoFinal + "+" + nuevaCantidad);
                }
                conexion.insertarDatos("UPDATE producto SET precio_normal= " + nf.format(nuevoPrecioVenta).replaceAll(",", ".") + ", precio_costo=" + precioPro + " where cod_producto like '" + cod + "'");
            }


            //ACTUALIZO INVENTARIO ABIERTO ###################
            //Realizo la actualizacion en el producto del inventario Abierto:
            ResultSet rInv = conexion.consultarBase("SELECT idInventario FROM inventario where abierto=true;");
           //System.out.println("REALIZO ACTUALIZACION INVENTARIO");
           //System.out.println("INVENTARIO?");
           //System.out.println("SELECT idInventario FROM inventario where abierto=true;" + conexion.obtenerFilas(rInv));
            if (conexion.obtenerFilas(rInv) > 0) {
               //System.out.println("Entra en INVENTARIO");
                rInv.beforeFirst();
                rInv.next();
                int codigoInv = rInv.getInt(1);
               //System.out.println(" INVENTARIO ABIERTO=" + codigoInv);
                //Busco este producto dentro del Inventario:
                ResultSet rPro = conexion.consultarBase("SELECT cantidad_act,cantidad_cont FROM productoinv where cod_inv=" + codigoInv + " and cod_producto like '" + cod + "';");
               //System.out.println("PRODUCTO?");
                if (conexion.obtenerFilas(rPro) > 0) {
                   //System.out.println("PRODUCTO INVENTARIO MOD=" + cod);
                    rPro.beforeFirst();
                    rPro.next();
                    //Valido el cambio de que no sea menor a cero
                    int cantAct = cant;
                    int cantCont = cant;


                    //Actualizo la Cantidad del producto del Inventario:
                    if (DocumentoKa.equals("S")) {
                        //Valido en el caso de la resta
                        if (rPro.getInt(1) < cantAct) {
                            cantAct = 0;
                        }
                        if (rPro.getInt(2) < cantCont) {
                            cantCont = 0;
                        }

                        conexion.insertarDatos("UPDATE productoinv SET cantidad_act=cantidad_act-" + cantAct + ", cantidad_cont=cantidad_cont-" + cantCont + " where cod_producto like '" + cod + "';");
                    } else if (DocumentoKa.equals("E")) {
                        conexion.insertarDatos("UPDATE productoinv SET cantidad_act=cantidad_act+" + cantAct + ", cantidad_cont=cantidad_cont+" + cantCont + " where cod_producto like '" + cod + "';");
                    }


                } else {
                    //Este producto fue creado recientemente y no esta dentro de los productos del inventario Abierto:
                    ResultSet rProNuevo = conexion.consultarBase("SELECT cod_producto,cod_categoria,nombre,descripcion,precio_costo,precio_normal,stock_total,precio_distribucion FROM producto p where cod_producto like '" + cod + "';");
                    rProNuevo.beforeFirst();
                    rProNuevo.next();
                    conexion.insertarDatos("insert into prductoinv values(" + codigoInv + ",'" + rProNuevo.getInt(1) + "','" + rProNuevo.getInt(2) + "','" + rProNuevo.getString(3) + "','" + rProNuevo.getString(4) + "'," + rProNuevo.getDouble(5) + "," + rProNuevo.getDouble(6) + "," + rProNuevo.getInt(7) + ",0," + rProNuevo.getDouble(8) + ");");
                }

            }
            //################################################



        } catch (java.sql.SQLException e) {
           //System.out.println("Error Actualizacion");
        };
        //inserto cabecera factura;

        return insercionVerific;
    }

    public boolean compruebaCantidadesStock(String cod, int cant, String letraDoc) {
        boolean verific = true;
        try {
            //Saco el numero Stock
           //System.out.println("*************************************");
            ResultSet r = conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + cod + "' and cod_bodega=" + bodega);
            r.next();
            int numeroStock = r.getInt(1);

            int stock = 0;
            //En el caso que sean kfacturas de Debito:
            if (letraDoc.equals("E")) {
                // //System.out.println("El codigo es:"+numeroStock);
                stock = numeroStock + cant;

                if (cant < 0) {
                    cant = cant*-1;
                }
                if (numeroStock < cant) {
                    verific = false;
                }

            } else if (letraDoc.equals("S")) {
                //Para el caso que sea una kfactura de Credito
                // //System.out.println("El codigo es:"+numeroStock);
                stock = numeroStock - cant;

            }

        } catch (java.sql.SQLException e) {
           //System.out.println("No existe el stock suficiente para realizar la transaccion.");
        }
        return verific;
    }

    public boolean actualizoStock(String cod, int cant, String letraDoc) {
        boolean insercionVerific = false;
        try {
            //Actualizo datos del Stock:

            //Saco el numero Stock
           //System.out.println("*************************************");
            ResultSet r = conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + cod + "' and cod_bodega=" + bodega);
            // //System.out.println("Logra la consulta::::");
            r.next();
            int numeroStock = r.getInt(1);

            int stock = 0;
            //En el caso que sean kfacturas de Debito:
            if (letraDoc.equals("E")) {
                // //System.out.println("El codigo es:"+numeroStock);
                stock = numeroStock + cant;

            } else if (letraDoc.equals("S")) {
                //Para el caso que sea una kfactura de Credito
                // //System.out.println("El codigo es:"+numeroStock);
                stock = numeroStock - cant;
            }


            //Actualizo el numero
            //System.out.println("Actualiza los datos del Item: "+cod+" de: "+numeroStock+" a:"+stock);
            conexion.insertarDatos("update itm_bodega set cantidad=" + stock + " where cod_producto like '" + cod + "' and cod_bodega=" + bodega);

            //Verifico la Actualizacion: (Verifico la Transaccion se realice exitosamente para este producto)
            r = conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + cod + "' and cod_bodega=" + bodega);
            r.next();
            int numeroActual = r.getInt(1);
            if (numeroActual == stock) {
                //Transaccion Verificada!:
                insercionVerific = true;
            }

            //Actualizo Total en los productos de las diferentes bodegas
            int tot = 0;
            ResultSet respuesta = conexion.consultarBase("select sum(cantidad) from itm_bodega where cod_producto like '" + cod + "'");
            respuesta.next();
            tot = respuesta.getInt(1);
            conexion.insertarDatos("UPDATE producto SET stock_total= " + tot + " where cod_producto like '" + cod + "'");


            //ACTUALIZO INVENTARIO ABIERTO ###################
            //Realizo la actualizacion en el producto del inventario Abierto:
            ResultSet rInv = conexion.consultarBase("SELECT idInventario FROM inventario where abierto=true;");
           //System.out.println("REALIZO ACTUALIZACION INVENTARIO");
           //System.out.println("INVENTARIO?");
           //System.out.println("SELECT idInventario FROM inventario where abierto=true;" + conexion.obtenerFilas(rInv));
            if (conexion.obtenerFilas(rInv) > 0) {
               //System.out.println("Entra en INVENTARIO");
                rInv.beforeFirst();
                rInv.next();
                int codigoInv = rInv.getInt(1);
               //System.out.println(" INVENTARIO ABIERTO=" + codigoInv);
                //Busco este producto dentro del Inventario:
                ResultSet rPro = conexion.consultarBase("SELECT cantidad_act,cantidad_cont FROM productoinv where cod_inv=" + codigoInv + " and cod_producto like '" + cod + "';");
               //System.out.println("PRODUCTO?");
                if (conexion.obtenerFilas(rPro) > 0) {
                   //System.out.println("PRODUCTO INVENTARIO MOD=" + cod);
                    rPro.beforeFirst();
                    rPro.next();
                    //Valido el cambio de que no sea menor a cero
                    int cantAct = cant;
                    int cantCont = cant;


                    //Actualizo la Cantidad del producto del Inventario:
                    if (letraDoc.equals("S")) {
                        //Valido en el caso de la resta
                        if (rPro.getInt(1) < cantAct) {
                            cantAct = 0;
                        }
                        if (rPro.getInt(2) < cantCont) {
                            cantCont = 0;
                        }
                        conexion.insertarDatos("UPDATE productoinv SET cantidad_act=cantidad_act-" + cantAct + ", cantidad_cont=cantidad_cont-" + cantCont + " where cod_producto like '" + cod + "';");
                    } else if (letraDoc.equals("E")) {
                        conexion.insertarDatos("UPDATE productoinv SET cantidad_act=cantidad_act+" + cantAct + ", cantidad_cont=cantidad_cont+" + cantCont + " where cod_producto like '" + cod + "';");
                    }


                } else {
                    //Este producto fue creado recientemente y no esta dentro de los productos del inventario Abierto:
                    ResultSet rProNuevo = conexion.consultarBase("SELECT cod_producto,cod_categoria,nombre,descripcion,precio_costo,precio_normal,stock_total,precio_distribucion FROM producto p where cod_producto like '" + cod + "';");
                    rProNuevo.beforeFirst();
                    rProNuevo.next();
                    conexion.insertarDatos("insert into prductoinv values(" + codigoInv + ",'" + rProNuevo.getInt(1) + "','" + rProNuevo.getInt(2) + "','" + rProNuevo.getString(3) + "','" + rProNuevo.getString(4) + "'," + rProNuevo.getDouble(5) + "," + rProNuevo.getDouble(6) + "," + rProNuevo.getInt(7) + ",0," + rProNuevo.getDouble(8) + ");");
                }

            }
            //################################################



        } catch (java.sql.SQLException e) {
           //System.out.println("Error Actualizacion");
        };
        //inserto cabecera factura;



        return insercionVerific;
    }

    private void tablaInputMethodTextChanged(java.awt.event.InputMethodEvent evt) {//GEN-FIRST:event_tablaInputMethodTextChanged
// TODO add your handling code here:
    }//GEN-LAST:event_tablaInputMethodTextChanged

    private void formMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseEntered
// TODO add your handling code here:
    }//GEN-LAST:event_formMouseEntered

private void txt_codFacKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_codFacKeyPressed
    //busqueda de la factura para su posterior  anulacion 
}//GEN-LAST:event_txt_codFacKeyPressed
    JTable tabla1 = new JTable(100, 5);
private void txt_codFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_codFacActionPerformed

    if (txt_codFac.getText().equals("")) {
        limpiaFactura();
        JOptionPane.showMessageDialog(this, "Ingrese el codigo de la Factura", "Error", JOptionPane.ERROR_MESSAGE);
    } else {
        if (conexion.existeCodigo("kfactura", "cod_kfactura", txt_codFac.getText())) {
            if (estaActivaDoc == 1) {
                if (verificaAnulacion(txt_codFac.getText()) == true) {
                    cargarFactura(txt_codFac.getText());
                } else {
                    limpiaFactura();
                    JOptionPane.showMessageDialog(this, "La factura no ha sido anulada", "Error", JOptionPane.ERROR_MESSAGE);
                }
            } else {//----------------
                if (verificaAnulacion(txt_codFac.getText()) == false) {
                    cargarFactura(txt_codFac.getText());
                } else {
                    limpiaFactura();
                    JOptionPane.showMessageDialog(this, "La factura ya ha sido anulada", "Error", JOptionPane.ERROR_MESSAGE);
                }
            }
        } else {
            limpiaFactura();
            JOptionPane.showMessageDialog(this, "El codigo de la Factura no existe", "Error", JOptionPane.ERROR_MESSAGE);

        }
    }
}//GEN-LAST:event_txt_codFacActionPerformed
    public boolean verificaAnulacion(String codigoFactura) {
        boolean anulado = false;
        ResultSet conjuntoResultados = conexion.consultarBase("select estato_ka from kfactura where cod_kfactura=" + codigoFactura + " and tipo_comprobante='" + letraDoc + "'");
        try {
            while (conjuntoResultados.next()) {
                if (conjuntoResultados.getString("estato_ka").equals("N")) {
                    anulado = true;
                    break;
                }
            }
        } catch (java.sql.SQLException ep) {
        }
        return anulado;
    }

//carga la factura una vez que se ingrese el codigo 
    public void cargarFactura(String codigoFactura) {
        jScrollPane1.remove(tabla);
        jScrollPane1.add(tabla1);
        jScrollPane1.setViewportView(tabla1);
        conexion.limpiar(tabla1);
        tabla1.getColumnModel().getColumn(0).setHeaderValue("Codigo");
        tabla1.getColumnModel().getColumn(1).setHeaderValue("Cantidad");
        tabla1.getColumnModel().getColumn(2).setHeaderValue("Articulo");
        tabla1.getColumnModel().getColumn(3).setHeaderValue("PUnitario");
        tabla1.getColumnModel().getColumn(4).setHeaderValue("Total");

        setVisible(true);
        limpiaFactura();

        String consultaCabecera = "select c.cod_cliente,c.nombre,c.direccion,c.telefono,p.vendedor_ka,"
                + "p.cod_kfactura,p.iva,p.descuento,p.totalNeto,p.total_pagado,p.fecha_ka,p.fecha_anulacion,p.desc_anulacion "
                + "from   cliente c,kfactura p,dtl_kfactura dtl "
                + "where  c.cod_cliente=p.cod_cliente and p.cod_kfactura=dtl.cod_kfactura and p.cod_kfactura=" + codigoFactura + " and dtl.tipoDoc like '" + letraDoc + "'   and p.tipo_comprobante like '" + letraDoc + "' "
                + "group by p.cod_kfactura";
        java.util.Vector consultaCabFac = conexion.consulta(consultaCabecera);
        java.util.Vector consultaCabFacInt = new java.util.Vector();
        for (int i = 0; i < consultaCabFac.size(); i++) {
            consultaCabFacInt = (java.util.Vector) consultaCabFac.elementAt(i);
            txt_id.setText(consultaCabFacInt.elementAt(0).toString());
            txt_nom.setText(consultaCabFacInt.elementAt(1).toString());
            txt_dir.setText(consultaCabFacInt.elementAt(2).toString());
            txt_tel.setText(consultaCabFacInt.elementAt(3).toString());
            txt_vend.setText(consultaCabFacInt.elementAt(4).toString());
            txt_porIva.setText(consultaCabFacInt.elementAt(6).toString());
            txt_desc.setText(consultaCabFacInt.elementAt(7).toString());
            txt_sub.setText(consultaCabFacInt.elementAt(8).toString());
            txt_tot.setText(consultaCabFacInt.elementAt(9).toString());
            lbl_fecha.setText(consultaCabFacInt.elementAt(10).toString());


            String valIva = txt_porIva.getText().toString();
            if (valIva.equals("")) {
                valIva = "0";
            }
            double porcentaje = Double.parseDouble(valIva);
            double iva = ((Double.parseDouble(consultaCabFacInt.elementAt(8).toString()) - Double.parseDouble(consultaCabFacInt.elementAt(7).toString())) * porcentaje) / 100;
            txt_iva.setText(nf.format(iva).replaceAll(",", "."));

            //es debido a que este campo puede tener un valor  nulo
            try {
                lbl_anulacion.setText(consultaCabFacInt.elementAt(11).toString());
            } catch (java.lang.NullPointerException e) {
            }
            //area.setText(consultaCabFacInt.elementAt(14).toString());
        }
        String consultaDetalle = "select dtl.cod_producto,dtl.cantidad,dtl.nombre_pro,dtl.precioPVP,dtl.subtotal "
                + "from   cliente c,kfactura p,dtl_kfactura dtl "
                + "where  c.cod_cliente=p.cod_cliente and p.cod_kfactura=dtl.cod_kfactura  and "
                + "p.cod_kfactura=" + codigoFactura + " and dtl.tipoDoc like '" + letraDoc + "'   and p.tipo_comprobante like '" + letraDoc + "';";

        java.util.Vector consultaDetlFac = conexion.consulta(consultaDetalle);
        java.util.Vector consultaDetlFacInt = new java.util.Vector();
        for (int i = 0; i < consultaDetlFac.size(); i++) {
            consultaDetlFacInt = (java.util.Vector) consultaDetlFac.elementAt(i);
            tabla1.setValueAt(consultaDetlFacInt.elementAt(0).toString(), i, 0);
            tabla1.setValueAt(consultaDetlFacInt.elementAt(1).toString(), i, 1);
            tabla1.setValueAt(consultaDetlFacInt.elementAt(2).toString(), i, 2);
            tabla1.setValueAt(consultaDetlFacInt.elementAt(3).toString(), i, 3);
            tabla1.setValueAt(consultaDetlFacInt.elementAt(4).toString(), i, 4);
        }

    }
//Metodo para limpiar la tabla y  campos, esto solo en el caso de anulacion de factura

    public void limpiaFactura() {
        conexion.limpiar(tabla1);
        txt_id.setText("");
        txt_nom.setText("");
        txt_dir.setText("");
        txt_tel.setText("");
        txt_vend.setText("");
        txt_porIva.setText("0.00");
        txt_desc.setText("0.00");
        txt_sub.setText("0.00");
        txt_tot.setText("0.00");
        txt_iva.setText("0.00");
        txt_porDesc.setText("%");
        lbl_fecha.setText("");

    }
//metodo para desactivar los controles en caso de anulacion de factura

    public void desactivaControles() {
        txt_codFac.setVisible(true);
        btn_BuscaFac.setVisible(true);
        btn_anulaFac.setVisible(true);
        lbl_fact.setVisible(false);
        bt_mod.setVisible(false);
        lbl_vend.setVisible(false);
        txt_vend.setVisible(false);
        bt_ap.setVisible(false);
        bt_borrar.setVisible(false);
        ck_desc.setVisible(false);
        bt_limpiar.setVisible(false);
        bt_registra.setVisible(false);
        txt_porDesc.setEnabled(false);
        tabla1.setEnabled(false);
        txt_id.setEnabled(false);
        lbl_fecha.setText("");
        jLabel10.setVisible(true);
        lbl_anulacion.setVisible(true);


    }

    public void desaContVisor() {
        btn_anulaFac.setVisible(false);
        //txt_motAnula.setEditable(false);
        lbl_anulacion.setText("");
        lbl_fechaAnulacion.setVisible(true);
    }

//metodo para la anular la factura area
    public void anulaFactura() {
        if (txt_codFac.getText().equals("")) {
            JOptionPane.showMessageDialog(this, "Ingrese el codigo de la Factura", "Error", JOptionPane.ERROR_MESSAGE);
        } else {
            if (conexion.existeCodigo("kfactura", "cod_kfactura", txt_codFac.getText())) {
                if (verificaAnulacion(txt_codFac.getText()) == false) {


                    int opccion = 0;
                    opccion = JOptionPane.showConfirmDialog(this, "Seguro que desea anular esta factura?", "Alerta", 0);
                    if (opccion == 0) {
                        try {
                            conexion.consultarBase("START TRANSACTION;");
                            String fecha_Actual = new java.sql.Date(System.currentTimeMillis()).toString();
                            conexion.insertarDatos("update kfactura set estato_ka='N',fecha_anulacion='" + fecha_Actual + "' where cod_kfactura=" + txt_codFac.getText() + "  and tipo_comprobante='" + letraDoc + "';");
                            String consultaDetalle = "select dtl.cod_producto,dtl.cantidad,pr.nombre,precio_costo,dtl.subtotal "
                                    + "from  cliente c,kfactura p,dtl_kfactura dtl,producto pr "
                                    + "where  c.cod_cliente=p.cod_cliente and p.cod_kfactura=dtl.cod_kfactura and dtl.cod_producto=pr.cod_producto and "
                                    + "p.cod_kfactura=" + txt_codFac.getText() + " and dtl.tipoDoc like '" + letraDoc + "'   and p.tipo_comprobante like '" + letraDoc + "';";
                            String codigoFactura=txt_codFac.getText();
                            java.util.Vector consultaDetlFac = conexion.consulta(consultaDetalle);
                            java.util.Vector consultaDetlFacInt = new java.util.Vector();
                            for (int i = 0; i < consultaDetlFac.size(); i++) {
                                consultaDetlFacInt = (java.util.Vector) consultaDetlFac.elementAt(i);
                                //se utiliza el menos por que se utiliza el metodo de actualiza stock que es para 
                                //la factura en el cual el stock se resta y en este caso necesitamos sumar
                                boolean verificCantidades = compruebaCantidadesStock(consultaDetlFacInt.elementAt(0).toString(), -Integer.parseInt(consultaDetlFacInt.elementAt(1).toString()), letraDoc);
                                if (verificCantidades) {
                                    actualizoStock(consultaDetlFacInt.elementAt(0).toString(), -Integer.parseInt(consultaDetlFacInt.elementAt(1).toString()), letraDoc);
                                    asientoAnula(codigoFactura, letraDoc);

                                    //Anulo las Cuentas x Cobrar o pagar Relacionadas:
                                    anuloCuentasRel(codigoFactura, letraDoc);

                                    
                                    txt_codFac.setText("");
                                    conexion.consultarBase("COMMIT;");
                                } else {
                                    conexion.consultarBase("ROLLBACK;");
                                    JOptionPane.showMessageDialog(this, "La cantidad del producto ("+consultaDetlFacInt.elementAt(0).toString()+"), no permiten realizar la transacciÃ³n. ", "Error", JOptionPane.ERROR_MESSAGE);
                                    break;
                                }
                            }
                            limpiaFactura();

                        } catch (Exception es) {
                            conexion.consultarBase("ROLLBACK;");
                        }
                    }// fin if(opcion)


                } else {
                    JOptionPane.showMessageDialog(this, "La factura ya ha sido anulada ", "Error", JOptionPane.ERROR_MESSAGE);
                }
            } else {
                limpiaFactura();
                JOptionPane.showMessageDialog(this, "El cÃ³digo de la Factura no existe", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    public void anuloCuentasRel(String codigo, String tipoDoc) {
        ResultSet respuesta = conexion.consultarBase("SELECT * FROM cuentaspendientes where cod_factura like '" + tipoDoc + codigo + "' and pagado like 'falta';");
        int filas = conexion.obtenerFilas(respuesta);
        if (filas > 0) {
            conexion.actualizarBase("update cuentaspendientes set pagado='Anulado' where cod_factura like '" + tipoDoc + codigo + "' and pagado like 'falta';");
        }
    }
private void txt_codFacKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_codFacKeyTyped
    char c = evt.getKeyChar();
    if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))) {
        getToolkit().beep();
        evt.consume();
    }
}//GEN-LAST:event_txt_codFacKeyTyped

private void btn_anulaFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_anulaFacActionPerformed
    anulaFactura();

}//GEN-LAST:event_btn_anulaFacActionPerformed

private void btn_BuscaFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_BuscaFacActionPerformed
    if (estaActivaDoc == 1) { //solo para facturas Anuladas
        listaFacturas listaFac = new listaFacturas(conexion, this, 1, 2, 1, user);
        listaFac.setVisible(true);
    } else {
        listaFacturas listaFac = new listaFacturas(conexion, this, 0, 2, 1, user);
        listaFac.setVisible(true);
    }
}//GEN-LAST:event_btn_BuscaFacActionPerformed

private void txt_porDescKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porDescKeyTyped
// TODO add your handling code here:
    int press = evt.getKeyChar();
    if (press == 10) {
        actualizoTotales();
    }
    //parte utilizada  para solo dejar ingrsar numeros 
    char c = evt.getKeyChar();
    if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE)) && c != '.') {
        getToolkit().beep();
        evt.consume();
    }
}//GEN-LAST:event_txt_porDescKeyTyped

private void txt_porDescKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porDescKeyReleased
// TODO add your handling code here:
    actualizoTotales();
}//GEN-LAST:event_txt_porDescKeyReleased

private void txt_porDescActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_porDescActionPerformed
// TODO add your handling code here:
    actualizoTotales();
}//GEN-LAST:event_txt_porDescActionPerformed

private void txt_descKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_descKeyTyped
//parte utilizada  para solo dejar ingrsar numeros 
    char c = evt.getKeyChar();
    if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE)) && c != '.') {
        getToolkit().beep();
        evt.consume();
    }
}//GEN-LAST:event_txt_descKeyTyped

private void txt_descKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_descKeyReleased
// TODO add your handling code here:
    actualizoTotales();
}//GEN-LAST:event_txt_descKeyReleased

private void txt_descActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_descActionPerformed
}//GEN-LAST:event_txt_descActionPerformed

private void ck_descActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ck_descActionPerformed
// TODO add your handling code here:

    if (ck_desc.isSelected()) {
        txt_porDesc.setText("%");
        txt_desc.setText("0");
        txt_porDesc.setEditable(false);
        txt_desc.setEditable(true);

    } else {
        txt_porDesc.setText("0");
        txt_desc.setText("0");
        txt_porDesc.setEditable(true);
        txt_desc.setEditable(false);
    }
    actualizoTotales();
}//GEN-LAST:event_ck_descActionPerformed

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
// TODO add your handling code here:
    VentCreaProd vcp = new VentCreaProd(conexion, bodega, this);
}//GEN-LAST:event_jButton2ActionPerformed

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
    // TODO add your handling code here:
    PanelCompraWeb pcw = new PanelCompraWeb(conexion, bodega, this);


}//GEN-LAST:event_jButton3ActionPerformed

    class MyTableChangedListener implements TableModelListener {

        public void tableChanged(TableModelEvent evt) {
            if (eventoTabla) {

                int row = evt.getFirstRow();
                int column = evt.getColumn();
                Object dato1 = tabla.getValueAt(row, column);
                String dato = String.valueOf(dato1);
                dato = dato.replaceAll(" ", "");

                if (dato != "" && dato != "null") {


                    if (column == 1) { //Modifico la columna de Cantidad:
                        cambioCantidad(dato, row);
                    }

                    if (column == 0) { //Modifico la columna del Codigo:
                        //   //System.out.println("**************//Cambio en Tabla*/*/*/***********************");
                        //   //System.out.println("Los datos obtenidos son:"+row+column);
                        //   //System.out.println("El dato es="+dato);
                        actualizoSubtotal = false;

                        int linea = siExisteCodigo(dato, row);
                       //System.out.println("La linea Obtenida es:" + linea + ":" + row);
                        if (linea >= 0 && silimpio == false) {
                           //System.out.println("Si LIMPIO =" + silimpio);
                            mostrarDialogo();
                            tabla.setValueAt(null, row, column);
                            metodoActCant(linea);

                        } else {
                            //Consulta a la base de datos el codigo.
                           //System.out.println("Obtengo Valores:" + dato + " " + row);
                            obtengoValores(dato, row);
                            actualizoTotales();


                        }
                        actualizoSubtotal = true;
                    }
                    if (column == 3) {//Cambio el precio de entrada
                        Object cantidad = tabla.getValueAt(row, column);
                        actualizoPrecio(cantidad, row);
                    }

                    if (column == 1 && dato != null) {
                        //Actualizo El subtotal:
                        if (actualizoSubtotal == true) {
                            Object cantidad = tabla.getValueAt(row, column);
                            actualizoSubtotal(cantidad, row);
                        }
                    } else {
                        //Hago el cambio de cantidad.
                        //System.out.println("No encontro este producto");
                        actualizoTotales();
                    }

                }
            }
        }
    }

    public void metodoActCant(int linea) {
       //System.out.println("Enfoco la linea:" + linea);
        //Enfoco el scroll:
        tabla.addRowSelectionInterval(linea, linea);
        if (linea == 0) {
            linea = 1;
        }
        tabla.scrollRectToVisible(tabla.getCellRect(linea, 1, true));
    }

    private void cambioCantidad(String dato, int row) {
        if (Etiqueta.getText().equals("Factura de Compras")) {
        } else {
            String codigop = tabla.getValueAt(row, 0).toString();
            ResultSet resp;
            resp = conexion.consultarBase("select b.cantidad from producto i,itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + codigop + "' and cod_bodega=" + bodega);
            int stock = 0;
            try {
                resp.beforeFirst();
                resp.next();
               //System.out.println("El stock obtenido es:" + stock);

                stock = resp.getInt(1);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }

            if (Integer.parseInt(dato.toString()) <= stock) {
            } else {
                JOptionPane.showMessageDialog(this, "Solo hay " + stock + " de este producto. No tenemos " + Integer.parseInt(dato.toString()), "Informacion", JOptionPane.INFORMATION_MESSAGE);
                tabla.setValueAt(stock, row, 1);
            }
        }
    }

    public void actualizoPrecio(Object o, int fila) {
        double precio = Double.parseDouble(o.toString());

        double cantidad = Double.parseDouble(tabla.getValueAt(fila, 1).toString());
        double subtotal = cantidad * precio;

        String sub = nf.format(subtotal).replaceAll(",", ".");
        tabla.setValueAt(sub, fila, 5);
    }

    public void actualizoSubtotal(Object o, int fila) {
        int cantidad = Integer.parseInt(o.toString());
        Object p = tabla.getValueAt(fila, 4);
        double precio = Double.parseDouble(p.toString());
        double subtotal = cantidad * precio;

        String sub = nf.format(subtotal).replaceAll(",", ".");
        tabla.setValueAt(sub, fila, 5);
    }

    public void mostrarDialogo() {

        JOptionPane.showMessageDialog(this, "Este codigo ya esta en la Factura", "Informacion", JOptionPane.INFORMATION_MESSAGE);
    }

    public void obtengoValores(Object codigo, int fila) {
        //Obtengo de la base de datos
        //fila es el dato de entrada
        ResultSet resul = null;
        int NumResp = 0;
        try {
            //Saco el Stock:
            String frase = "";
            int stock = 0;

            //Para el Caso que NO sea un Combo:
            if (!esCombo(codigo.toString())) {
                resul = conexion.consultarBase("select i.nombre,i.precio_costo,b.cantidad,i.precio_normal from producto i,itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + codigo + "' and cod_bodega=" + bodega);
                NumResp = conexion.obtenerFilas(resul);
               //System.out.println("El numero de filas es:" + NumResp);
                stock = resul.getInt(3);

            } else {
                resul = conexion.consultarBase("select i.nombre,i.precio_costo,b.cantidad,i.precio_normal from producto i where i.cod_producto like '" + codigo + "'");
                NumResp = conexion.obtenerFilas(resul);
                stock = obtenerStockCombo(codigo.toString());
            }

            //En el caso que la Venta sea Factura de Compras no necesita verificar el stock
           //System.out.println("La Etiqueta es:" + Etiqueta.getText());
            if (Etiqueta.getText().equals("Factura de Compras")) {
               //System.out.println("Llega Hasta aquixxxxx El stock es:" + stock);
                if (NumResp > 0) {


                    String ca = "";
                    String mens = "Ingrese una Cantidad > 0";
                    int cantidad = 0;

                    while (ca.equals("") || ca == null || cantidad <= 0) {

                        try {
                            ca = JOptionPane.showInputDialog(this, mens, "AVISO", 2);
                            if (ca == null) {
                                //Aplasto cancel
                                break;
                            }

                            ca = ca.replaceAll(" ", "");
                           //System.out.println("Lo que escribiste fue:" + ca);
                            cantidad = Integer.parseInt(ca);
                        } catch (Exception e) {
                            cantidad = -1;
                        }

                    }

                    if (ca != null) {
                        double can = Double.parseDouble(ca);
                        //System.out.println("La cantidad es:"+can);
                        tabla.setValueAt(ca, fila, 1);

                        //Obtengo y Muestro el Nombre txt_sub
                        String desc = resul.getString(1);
                       //System.out.println("El nombre es:" + desc);
                        tabla.setValueAt(desc, fila, 2);

                        //Obtengo y Muestro el Precio:
                        double precio = resul.getDouble(2);
                       //System.out.println("El precio de Costo es:" + precio);
                        tabla.setValueAt(nf.format(precio).replaceAll(",", "."), fila, 3);

                        //Obtengo y Muestro el Precio:
                        double precioVP = resul.getDouble(4);
                       //System.out.println("El precio de Venta es:" + precioVP);
                        tabla.setValueAt(nf.format(precioVP).replaceAll(",", "."), fila, 4);

                        //Obtengo y Muestro los Totales:
                        double sub = precioVP * can;
                        //System.out.println("El subtotal es:"+sub);
                        tabla.setValueAt(nf.format(sub).replaceAll(",", "."), fila, 5);
                    } else {
                        limpiarFila(fila);
                        tabla.clearSelection();

                    }



                } else {
                    int opccion = 0;
                    opccion = JOptionPane.showConfirmDialog(this, "Desea Buscar el Producto", "Alerta", 0);
                    if (opccion == 0) {

                        BuscadorProducto b = new BuscadorProducto(conexion, this, bodega);
                        String value = String.valueOf(tabla.getValueAt(fila, 0));
                        if (value == null || value.equals("")) {
                            value = "texto";
                        }

                        b.txt_buscar.setText(value);
                        b.muestraBusqueda(value);
                        int filaSeleccionada = tabla.getSelectedRow();
                        limpiarFila(filaSeleccionada);

                    }
                }

            }

            //En el caso que la Venta sea Factura de Compras no necesita verificar el stock
            if (Etiqueta.getText().equals("Devolucion en Compras")) {
                if (NumResp > 0) {

                   //System.out.println("Llega Hasta aquixxxxx El stock es:" + stock);
                    String ca = "";
                    String mens = "Ingrese una Cantidad > " + stock;
                    int cantidad = 0;
                    if (stock == 0) {
                        JOptionPane.showMessageDialog(this, "No existe stock enla bodega de este producto", "Informacion", JOptionPane.INFORMATION_MESSAGE);
                        limpiarFila(fila);
                    } else {

                        while (ca.equals("") || ca == null || cantidad > stock || cantidad <= 0) {

                            try {
                                ca = JOptionPane.showInputDialog(this, mens, "AVISO", 2);
                                if (ca == null) {
                                    //Aplasto cancel
                                    break;
                                }

                                ca = ca.replaceAll(" ", "");
                               //System.out.println("Lo que escribiste fue:" + ca);
                                cantidad = Integer.parseInt(ca);
                            } catch (Exception e) {
                                cantidad = -1;
                            }

                        }

                        if (ca != null) {
                            double can = Double.parseDouble(ca);
                            //System.out.println("La cantidad es:"+can);
                            tabla.setValueAt(ca, fila, 1);

                            //Obtengo y Muestro el Nombre txt_sub
                            String desc = resul.getString(1);
                           //System.out.println("El nombre es:" + desc);
                            tabla.setValueAt(desc, fila, 2);

                            //Obtengo y Muestro el Precio:
                            double precio = resul.getDouble(2);
                           //System.out.println("El precio de Costo es:" + precio);
                            tabla.setValueAt(nf.format(precio).replaceAll(",", "."), fila, 3);

                            //Obtengo y Muestro el Precio:
                            double precioVP = resul.getDouble(4);
                           //System.out.println("El precio de Venta es:" + precioVP);
                            tabla.setValueAt(nf.format(precioVP).replaceAll(",", "."), fila, 4);

                            //Obtengo y Muestro los Totales:
                            double sub = precioVP * can;
                            //System.out.println("El subtotal es:"+sub);
                            tabla.setValueAt(nf.format(sub).replaceAll(",", "."), fila, 5);
                        } else {
                            limpiarFila(fila);
                            tabla.clearSelection();

                        }

                    }

                } else {
                    int opccion = 0;
                    opccion = JOptionPane.showConfirmDialog(this, "Desea Buscar el Producto", "Alerta", 0);
                    if (opccion == 0) {

                        BuscadorProducto b = new BuscadorProducto(conexion, this, bodega);
                        String value = String.valueOf(tabla.getValueAt(fila, 0));
                        if (value == null || value.equals("")) {
                            value = "texto";
                        }

                        b.txt_buscar.setText(value);
                        b.muestraBusqueda(value);
                        int filaSeleccionada = tabla.getSelectedRow();
                        limpiarFila(filaSeleccionada);




                    }
                }

            }


        } catch (java.sql.SQLException e) {
            int opccion = 0;
            opccion = JOptionPane.showConfirmDialog(this, "Desea Buscar el Producto", "Alerta", 0);
            if (opccion == 0) {

                BuscadorProducto b = new BuscadorProducto(conexion, this, bodega);
                String value = String.valueOf(tabla.getValueAt(fila, 0));
                if (value == null || value.equals("")) {
                    value = "texto";
                }

                b.txt_buscar.setText(value);
                b.muestraBusqueda(value);
                int filaSeleccionada = tabla.getSelectedRow();
                limpiarFila(filaSeleccionada);


            }

        };

    }

    public int obtenerStockCombo(String codigoCombo) {
        //Actualizo Productos del Combo:
        ResultSet resultado;
        resultado = conexion.consultarBase("select * from combo where cod_combo like '" + codigoCombo + "'");
        int PosibleComboPro[] = new int[conexion.obtenerFilas(resultado)];
        try {
            resultado.beforeFirst();
            int i = 0;
            while (resultado.next()) {
                String codPro = resultado.getString(2);
                int cantPro = resultado.getInt(4);

                //Saco el Stock del Producto:
                ResultSet r = conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '" + codPro + "' and cod_bodega=" + bodega);
                r.next();
                int StockProducto = r.getInt(1);
                PosibleComboPro[i] = StockProducto / cantPro;
                i++;
            }
        } catch (SQLException sqle) {
           //System.out.println("Error al mostrar los resultados de la consulta");
            System.err.println(sqle);
        }

        int NumCombos = PosibleComboPro[0];
        for (int j = 0; j < PosibleComboPro.length; j++) {
            int punt = PosibleComboPro[j];

            if (punt < NumCombos) {
                NumCombos = punt;
            }
        }



        return NumCombos;
    }

    public void actualizoTotales() {
        ////System.out.println("Entra en actualiza");
        int numeroCol = tabla.getRowCount();
        int cont = 0;
        double acumula = 0;
        String toma;

        double acumulaCosto = 0;
        String tomaCosto;

        //Muestro Los Subtotales:
        while (cont < numeroCol) {

            try {
                toma = tabla.getValueAt(cont, 5).toString();

                //Calculo Subtotal Costo:
                //tomaCosto=tabla.getValueAt(cont, 3).toString();
                double precCCosto = Double.valueOf(tabla.getValueAt(cont, 3).toString());
                double cantCCosto = Double.valueOf(tabla.getValueAt(cont, 1).toString());
                double ccosto = precCCosto * cantCCosto;
                tomaCosto = String.valueOf(ccosto);

                acumula = acumula + Double.parseDouble(toma);
                acumulaCosto = acumulaCosto + Double.parseDouble(tomaCosto);
            } catch (Exception e) {
            };

            cont++;
        }
        txt_sub.setText(String.valueOf(nf.format(acumula).replaceAll(",", ".")));

        this.tsubCosto.setText(String.valueOf(nf.format(acumulaCosto).replaceAll(",", ".")));

        //Muestro el Descuento
        double porcentaje = 0;
        double descuento = 0;
        double descuentoCosto = 0;
        if (ck_desc.isSelected()) {
            String valDesc = txt_desc.getText();
            if (valDesc.equals("")) {
                valDesc = "0";
            }
            //descuento=Double.parseDouble(nf.format(valDesc).replaceAll(",","."));
            descuento = Double.parseDouble(valDesc);
        } else {
            if (txt_porDesc.getText().equals("")) {
                porcentaje = 0;
            } else {
                porcentaje = Double.parseDouble(txt_porDesc.getText());
            }
            descuento = (acumula * porcentaje) / 100;
            descuentoCosto = (acumulaCosto * porcentaje) / 100;
            txt_desc.setText(nf.format(descuento).replaceAll(",", "."));
            this.tdesCosto.setText(nf.format(descuentoCosto).replaceAll(",", "."));
        }
        //Muestro El IVA
        String valIva = txt_porIva.getText().toString();
        if (valIva.equals("")) {
            valIva = "0";
        }
        try {
            porcentaje = Double.parseDouble(valIva);
        } catch (Exception e) {
            porcentaje = 0;
        }
        //double iva=(acumula*porcentaje)/100;
        descuento = Double.parseDouble(nf.format(descuento).replaceAll(",", "."));
        descuentoCosto = Double.parseDouble(nf.format(descuentoCosto).replaceAll(",", "."));
        double subDesc = acumula - descuento;
        double subDescCosto = acumulaCosto - descuentoCosto;
        //txt_SubDesc.setText(nf.format(subDesc).replaceAll(",","."));
        double iva = (subDesc * porcentaje) / 100;
        double ivaCosto = (subDescCosto * porcentaje) / 100;
        txt_iva.setText(nf.format(iva).replaceAll(",", "."));
        this.tivaCosto.setText(nf.format(ivaCosto).replaceAll(",", "."));
        //Muestro Total:
        //double total=(acumula+iva-descuento);
        double total = (subDesc + iva);
        double totalCosto = (subDescCosto + ivaCosto);

        txt_tot.setText(nf.format(total).replaceAll(",", "."));
        this.ttotalCosto.setText(nf.format(totalCosto).replaceAll(",", "."));
    }

    public int siExisteCodigo(Object codigo, int filaActual) {
        // Busca si existe el Codigo:
        int numeroFil = tabla.getRowCount();
        int cont = 0;

        Object toma;
        while (cont < numeroFil) {
            try {
                toma = tabla.getValueAt(cont, 0);
                //System.out.println("Compara: "+codigo+" "+toma);
                if (toma.equals(codigo) && filaActual != cont) {
                    // //System.out.println("Es igual");
                    return cont;

                }
            } catch (Exception e) {
            }
            cont++;
        }

        return cont = -1;
    }

    public boolean siExisteCodigo(Object codigo) {
        // Busca si existe el Codigo:
        int numeroFil = tabla.getRowCount();
        int cont = 0;
        boolean resp = false;
        int comp = 0;

        Object toma;
        while (cont < numeroFil) {
            try {
                toma = tabla.getValueAt(cont, 0);
                ////System.out.println("Compara: "+codigo+" "+toma);
                if (toma.equals(codigo)) {
                    comp++;
                    //    //System.out.println("Es igual");
                }
            } catch (java.lang.NullPointerException e) {
            };
            cont++;
        }
        if (comp > 1) {
            resp = true;
        }

        return resp;
    }

    public void limpiarFila(int fila) {
        tabla.setValueAt(null, fila, 0);
        tabla.setValueAt("", fila, 1);
        tabla.setValueAt("", fila, 2);
        tabla.setValueAt("", fila, 3);
        tabla.setValueAt("", fila, 4);
        actualizoTotales();
    }

    public int cuentaFilaOcupadas() {
        int totalfilas = tabla.getRowCount();
        int contador = 0;
        Object valor;
        for (contador = 0; contador < totalfilas; contador++) {
            valor = tabla.getValueAt(contador, 0);
            if (valor == null) {
                break;
            }

        }
        //System.out.println("El numero de fila ocupadas es:"+contador);
        return contador;
    }

    public int cuentaProductos() {

        int totalfilas = tabla.getRowCount();
       //System.out.println("El total filas es:" + totalfilas);
        int totalProductos = 0;
        int cuentanulls = 0;

        Object valor;
        for (int contador = 0; contador < totalfilas; contador++) {
            valor = tabla.getValueAt(contador, 0);
           //System.out.println(contador + ")valor es:" + valor + "\n");
            if (valor == null) {
                //System.out.print("El producto es null");
                cuentanulls++;
            } else {
                //System.out.print("El producto NO es null");    
                totalProductos++;
            }

        }


        //System.out.println("El total de nulls es: "+cuentanulls);
        //System.out.println("El total de productos son: "+totalProductos);
        return totalProductos;
    }

    ;
    //consultar el valor del iva de la tabla parametros
    //el valor del iva que se toma es el ultimo valor ingresado
    public String consultarIva() {
        String iva = "";
        java.util.Vector vecConsulta = conexion.consulta("select iva from parametros order by codigo desc limit 1");
        java.util.Vector vecInterno = new java.util.Vector();
        for (int i = 0; i < vecConsulta.size(); i++) {
            vecInterno = (java.util.Vector) vecConsulta.elementAt(i);
            iva = vecInterno.elementAt(0).toString();
        }
        return iva;
    }
    ;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    public javax.swing.JLabel Etiqueta;
    public javax.swing.JButton bt_ap;
    public javax.swing.JButton bt_borrar;
    public javax.swing.JButton bt_limpiar;
    public javax.swing.JButton bt_mod;
    public javax.swing.JButton bt_registra;
    public javax.swing.JButton btn_BuscaFac;
    public javax.swing.JButton btn_anulaFac;
    public javax.swing.JComboBox cb_metodo;
    private javax.swing.JCheckBox ck_desc;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    public javax.swing.JLabel lbl_anulacion;
    private javax.swing.JLabel lbl_f;
    public javax.swing.JLabel lbl_fact;
    private javax.swing.JLabel lbl_fecha;
    public javax.swing.JLabel lbl_fechaAnulacion;
    private javax.swing.JLabel lbl_vend;
    public javax.swing.JTable tabla;
    private javax.swing.JTextField tdesCosto;
    private javax.swing.JTextField tivaCosto;
    private javax.swing.JTextField tsubCosto;
    public javax.swing.JTextField ttotalCosto;
    public javax.swing.JTextField txt_codFac;
    private javax.swing.JTextField txt_desc;
    public javax.swing.JTextArea txt_dir;
    public javax.swing.JTextField txt_id;
    private javax.swing.JTextField txt_iva;
    public javax.swing.JTextField txt_nom;
    private javax.swing.JTextField txt_porDesc;
    public javax.swing.JTextField txt_porIva;
    private javax.swing.JTextField txt_sub;
    public javax.swing.JTextField txt_tel;
    public javax.swing.JTextArea txt_tot;
    private javax.swing.JPasswordField txt_vend;
    private javax.swing.JLabel txtdesccosto;
    private javax.swing.JLabel txtivacosto;
    private javax.swing.JLabel txtsubcosto;
    private javax.swing.JLabel txttotalcosto;
    // End of variables declaration//GEN-END:variables
}
